package com.ny.zmb.openapi.entity;

import com.baomidou.mybatisplus.annotation.IdType;
import com.baomidou.mybatisplus.annotation.TableId;
import com.baomidou.mybatisplus.annotation.TableName;
import com.ny.zmb.openapi.ysutil.from.BizReqJsonCollege.BizReqJsonRefund;
import com.ny.zmb.openapi.ysutil.utils.RequestNoUntil;
import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.NoArgsConstructor;

import java.io.Serializable;
import java.util.Date;

@TableName("pm_order_refund_log")
@AllArgsConstructor
@NoArgsConstructor
@Data
public class PmOrderRefundLog implements Serializable {

    private static final long serialVersionUID = 1L;
    @TableId(type = IdType.AUTO)
    private Long id;
    /**
     * 退款金额， 单位：元 取值范围：0.01-999999.99 退款金额不能大于原订单金额，多次退款时，累计退款金额不能超过原订单金额
     */
    private String amount;
    /**
     * 原交易订单是否分账， Y-是、N-否
     */
    private String isDivision;
    /**
     * 退款结果异步通知地址，为空则不通知
     */
    private String notifyUrl;
    /**
     * 原交易订单业务请求号
     */
    private String origRequestNo;
    /**
     * 原交易订单交易流水号
     */
    private String origTradeSn;
    /**
     * 退款原因
     */
    private String reason;
    /**
     * 退款资金来源，不传值则默认02 01-一般消费类账户 （原订单收款方）02-待结算账户（原订单收款方当天收单金额）03-发起方一般消费类账户（发起方）
     */
    private String refundSource;
    /**
     * 分账退款明细，分账退款明细列表
     */
    private String refundSplitInfo;
    /**
     * 商户系统生成的退款订单号， 标识一次退款请求，【需要保证唯一】。用同一订单号同一退款流水号继续退款时，则会返回第一次退款的结果不会继续退款 示例值：RD2023061713107
     */
    private String requestNo;
    /**
     * 原交易订单交易金额，单位：元 原交易类型为担保交易时必填
     */
    private String origAmount;
    /**
     * 原交易类型，不传值则默认01 01-即时交易（默认值）  02-担保交易
     */
    private String tranType;

    /**
     * 创建时间
     */
    private Date createdDate;
    /**
     * 更新时间
     */
    private Date updatedDate;

    /**
     * 0 处理中
     * 11 待确认（密码或短信验证）
     * 12 已付款，待发货（仅担保交易适用）
     * 13 已发货，待确认收货（仅担保交易适用）
     * 1 交易成功
     * 2 交易关闭
     * -1 交易失败
     * 21 部分退款成功
     * 22 全额退款成功
     * 13 交易冲正
     * 999 未知状态，请重新查询
     */
    private int status;
    /**
     * 备注
     */
    private String remarks;

    // 对象转换
    public PmOrderRefundLog(BizReqJsonRefund obj) {
        if (obj == null) throw new RuntimeException("空异常");
        if (obj.getRequestNo() == null || obj.getRequestNo().isEmpty()) {
            obj.setRequestNo(RequestNoUntil.generateNumericTaskNumber());
        }
        this.requestNo = obj.getRequestNo();
        this.origRequestNo = obj.getOrigRequestNo();
        this.origTradeSn = obj.getOrigTradeSn();
        this.refundSource = obj.getRefundSource();
        this.amount = obj.getAmount();
        this.reason = obj.getReason();
        this.isDivision = obj.getIsDivision();
        this.tranType = obj.getTranType();
        this.origAmount = obj.getOrigAmount();
        if (obj.getRefundSplitInfo() == null) {
            this.refundSplitInfo = "";
        } else {
            this.refundSplitInfo = obj.getRefundSplitInfo().toString();
        }
        this.notifyUrl = obj.getNotifyUrl();

        this.create();
    }


    public PmOrderRefundLog create() {
        this.createdDate = new Date();
        this.status = 0;
        return this;
    }


    /**
     * @param remarks
     * @return
     */
    public PmOrderRefundLog update(String status, String remarks) {
        this.getStatusByMsg(status);
        this.setRemarks(remarks);
        return this.update();
    }

    public PmOrderRefundLog update(int status, String remarks) {
        this.setRemarks(remarks);
        this.status = status;
        return this.update();
    }

    public PmOrderRefundLog update(int status) {
        this.status = status;
        return this.update();
    }

    public PmOrderRefundLog update() {
        this.updatedDate = new Date();
        return this;
    }

    /**
     * 判断
     *
     * @param msg
     * @return
     */
    public PmOrderRefundLog getStatusByMsg(String msg) {
        switch (msg) {
            case "PROCESSING":
                this.status = 0; // 处理中
                break;
            case "WAIT_PAY":
                this.status = 11; // 待确认（密码或短信验证）
                break;
            case "WAIT_DELIVERD":
                this.status = 12; // 已付款，待发货（仅担保交易适用）
                break;
            case "WAIT_CONFIRM":
                this.status = 13; // 已发货，待确认收货（仅担保交易适用）
                break;
            case "SUCCESS":
                this.status = 1; // 交易成功
                break;
            case "CLOSED":
                this.status = 2; // 交易关闭
                break;
            case "FAILED":
                this.status = -1; // 交易失败
                break;
            case "REFUND_PART":
                this.status = 21; // 部分退款成功
                break;
            case "REFUND_ALL":
                this.status = 22; // 全额退款成功
                break;
            case "REVERSAL":
                this.status = 13; // 交易冲正
                break;
            case "UNKNOW":
                this.status = 999; // 未知状态，请重新查询
                break;
            default:
                this.status = -999;
        }
        return this;
    }

}
